package com.ecr.hub.front.bean;

import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.context.FacesContext;

import org.apache.log4j.Logger;

import com.ecr.hub.ApplicationException;
import com.ecr.hub.model.enumeration.HubErrorLevel;
import com.ecr.hub.util.MessageUtils;

public abstract class AbstractManagedBean implements IManagedBean {

	// Le logger générique.
	private static final Logger log = Logger
			.getLogger(AbstractManagedBean.class);

	private static final long serialVersionUID = 1L;
	protected boolean displayMessage;
	protected String typeAction;
	protected int page = 1;

	// *******************************
	// Les méthodes.
	// *******************************

	/**
	 * Renvoi le degré de sévérité des messages. INFO/ERROR/FATAL. FacesMessage
	 * renvoi INFO 0, ERROR 2, etc.. on élimine les informations complémentaires
	 * et on place un booleen pour dire d'afficher le message dans la page
	 * principale et non dans la popup.
	 */
	public String getMaximumSeverity() {
		Severity maxSeverity = FacesContext.getCurrentInstance()
				.getMaximumSeverity();

		setDisplayMessage(false);

		if (null != maxSeverity) {
			if (FacesMessage.SEVERITY_INFO.equals(maxSeverity)) {
				setDisplayMessage(true);
				return HubErrorLevel.INFO.toString();
			} else if (FacesMessage.SEVERITY_ERROR.equals(maxSeverity)) {
				return HubErrorLevel.ERROR.toString();
			} else if (FacesMessage.SEVERITY_WARN.equals(maxSeverity)) {
				return HubErrorLevel.WARN.toString();
			} else if (FacesMessage.SEVERITY_FATAL.equals(maxSeverity)) {
				return HubErrorLevel.FATAL.toString();
			}
		}
		return null;
	}

	/**
	 * Méthode juste utilise pour remettre le numéro de la page courante à 1.
	 */
	protected void resetPage() {
		setPage(1);
	}

	/**
	 * Gestion centralisée des erreurs. Au départ, voulait faire la gestion des
	 * erreurs par AOP, mais cela engendre des problématiques avec les proxys de
	 * Spring....
	 */
	protected void getErrorHandler(Exception e) {

		if (e instanceof ApplicationException) {
			if (((ApplicationException) e).getErrorLevel() == HubErrorLevel.FATAL) {
				log.fatal(e.getMessage());
			} else {
				log.warn(e.getMessage());
			}
		} else {

			log.fatal(e.getMessage());
		}
		// Dans tous les cas on affiche la stack.
		log.error(ApplicationException.getStackTraceToString(e));
		MessageUtils.setMessageNoBundleError(e.getMessage());
	}

	// *******************************
	// Les getters et les setters.
	// *******************************

	public int getPage() {
		return page;
	}

	public String getTypeAction() {
		return typeAction;
	}

	public void setPage(int page) {
		this.page = page;
	}

	public void setTypeAction(String typeAction) {
		this.typeAction = typeAction;
	}

	public boolean isDisplayMessage() {
		return displayMessage;
	}

	public void setDisplayMessage(boolean displayMessage) {
		this.displayMessage = displayMessage;
	}
}
